//
// Created by ziya on 2025/5/21.
//

#ifndef YALANG_LEXER_2_TOKEN_H
#define YALANG_LEXER_2_TOKEN_H

typedef enum {
    // Literals
    TOKEN_NUMBER,
    TOKEN_INT_LITERAL,      // e.g. 123
    TOKEN_FLOAT_LITERAL,    // e.g. 3.14, 2e10
    TOKEN_STRING_LITERAL,   // e.g. "hello"
    TOKEN_CHAR_LITERAL,     // e.g. 'a'
    TOKEN_BOOL_LITERAL,     // true, false

    // Identifiers
    TOKEN_IDENTIFIER,       // e.g. variableName, func_1

    // Keywords
    TOKEN_IF,               // "if"
    TOKEN_ELSE,             // "else"
    TOKEN_WHILE,            // "while"
    TOKEN_FOR,              // "for"
    TOKEN_RETURN,           // "return"

    // Operators
    TOKEN_PLUS,             // +
    TOKEN_MINUS,            // -
    TOKEN_MUL,              // *
    TOKEN_DIV,              // /
    TOKEN_ASSIGN,           // =
    TOKEN_EQ,               // ==
    TOKEN_NEQ,              // !=
    TOKEN_LT,               // <
    TOKEN_GT,               // >
    TOKEN_LE,               // <=
    TOKEN_GE,               // >=
    TOKEN_AND,              // &
    TOKEN_OR,               // |
    TOKEN_NOT,              // !
    TOKEN_INC,              // ++
    TOKEN_DEC,              // --
    TOKEN_OPERATOR,

    // Delimiters
    TOKEN_LPAREN,           // (
    TOKEN_RPAREN,           // )
    TOKEN_LBRACE,           // {
    TOKEN_RBRACE,           // }
    TOKEN_SEMICOLON,        // ;
    TOKEN_COMMA,            // ,

    // Special
    TOKEN_EOF,              // end of file/input
    TOKEN_UNKNOWN           // unrecognized character
} token_type;

#endif //YALANG_LEXER_2_TOKEN_H
